const {
	isArray,
	isNull
} = Require("utils.libs.src.dao-type");

/**
 * 数组合并、去重
 *  var m = [1, 2, 2], n = [2,3,3]; 
 *  console.log(combine(m)); // [1, 2]
 *	console.log(combine(m,n)); // [1, 2, 3]
 */
function combine() {
	let arr = [].concat.apply([], arguments);
	return Array.from(new Set(arr));
}
/**
 * 将数组拆开平摊开 同时去重
 * @param {Object} array
 * @param {Object} isCombine
 */
function flat(array, isCombine) {
	let list = [];
	array.forEach(curArr => {
		curArr = isArray(curArr) ? curArr : [];
		list.push(...curArr);
	});
	return isCombine ? combine(list) : list;
}
/**
 * 拆分字符串为数组
 */
function parseArray(array, spliter = ",") {
	if (isNull(array)) {
		return [];
	}
	if (isArray(array)) {
		return array;
	}
	return array.split(spliter);
}
/**
 * 两个数组的交集
 */
function crossArray(arr1, arr2) {
	return arr2.filter(function(v) {
		return arr1.indexOf(v) !== -1 // 利用filter方法来遍历是否有相同的元素
	})
}
/**
 * 两个数组的差集
 */
function diffArray(arr1, arr2) {
	return arr2.concat(arr1).filter(function(v) {
		return arr2.indexOf(v) === -1 || arr3.indexOf(v) === -1
	})
}
/**
 * 判断对象数组的存在位置
 */
function posArrayByObject(arr, obj, key) {
	return arr.map(function(e) {
		return e[key];
	}).indexOf(obj[key]);
}
/**
 * 对象数组内容去重
 */
function uniqueArray(arr, key = '_id') {
	let hash = []
	for (let item of arr) {
		if (posArrayByObject(hash, item, key) < 0) {
			hash.push(item)
		}
	}

	return hash
}
/**
 * 对象数组排序
 */
function sortArrayByObject(arr, key) {
	arr.sort(function(a, b) {
		return a[key] - b[key]
	});
	return arr;
}
/**
 * 对象数组根据key得到item
 */
function getItemByKey(arr, key, val) {
	return arr.find(item => item[key] == val);
}
/**
 * 对象数组 排列组合展示
 * 针对规格数组排列组合
 */
function specArr2Arr(arr) {
	let results = [];
	let result = [];

	function doExchange(val, index) { // 递归展开
		for (var i = 0; i < val[index].length; i++) {
			result[index] = val[index][i];
			if (index != val.length - 1) {
				doExchange(val, index + 1)
			} else {
				results.push([...result])
			}
		}
	}
	doExchange(arr, 0);
	return results;
}
/**
 * object数组根据key转换为value数组
 */
function objectArray2valueArrayByKey(args, key = '') {
	let res = []
	if (!this.isArray(args) || args.length == 0 || key == '') return res
	for (let item of args) {
		if (this.isObject(item)) {
			res.push(item[key])
		} else {
			res.push(item)
		}
	}
	return res
}

module.exports = {
	parseArray,
	combine,
	flat,
	crossArray,
	diffArray,
	uniqueArray,
	posArrayByObject,
	sortArrayByObject,
	getItemByKey,
	specArr2Arr,
	objectArray2valueArrayByKey
};